﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenSource.UPnP;
using System.Collections;

namespace SurfaceServeur
{
    class ClientSurfaceServeur2
    {

        private UPnPDevice root2;
        private UPnPService list;

        /**
           * \nb_dev1        le nombre de devices connectés
        */
        private int nb_dev1;
        MainWindow mainwindow;

        /**
          * \cp1        instance de la classe UPnPSmartControlPoint 
       */
        private UPnPSmartControlPoint cp1;



        static ArrayList _zonesresultatFinal = new ArrayList();
        static public ArrayList ZonesresultatFinal
        { get { return _zonesresultatFinal; } set { _zonesresultatFinal = value; } }

        static ArrayList _zonesMeth = new ArrayList();

        static public ArrayList ZonesMeth
        { get { return _zonesMeth; } set { _zonesMeth = value; } }




        static ArrayList _zoneTest = new ArrayList();
        static public ArrayList ZonesTest
        { get { return _zoneTest; } set { _zoneTest = value; } }

        /**
         * \ClientSurfaceServeur2        Constructeur de la classe 'ClientSurfaceServeur2'
         * \param    mainw               de type MainWindow est l'interface graphique du 'SurfaceServeur' 
        */
        public ClientSurfaceServeur2(MainWindow mainw)
        {
            mainwindow = mainw;
            nb_dev1 = 0;
            
            root2 = UPnPDevice.CreateRootDevice(360, 1.0, "");
            root2.FriendlyName = "ClientSurfaceServeur2";
            root2.DeviceURN = "urn:schemas-upnp-org:device:ClientSurfaceServeur2:1";
            root2.HasPresentation = false;
            root2.Manufacturer = "sbai";
            root2.ModelName = "UPnP sample for kids";
            root2.UniqueDeviceName = "12345678-153f-430d-82f3-dff320c17502";

            list = new UPnPService(1.0, "Sample2", "urn:schemas-upnp-org:service:Sample2:1", true, this);
            
            list.AddMethod("call");

            root2.AddService(list);
            root2.Advertise();
            }


        /**
        * \Search               pour la recherche d'un device sur le réseau
        * \param    meth        le nom de la méthode à appeler côté client 
        */
        public void Search(string meth)
        {
            _zonesMeth.Add(meth);

             cp1 = new UPnPSmartControlPoint(new UPnPSmartControlPoint.DeviceHandler(NewDevice));


            cp1.OnRemovedDevice += new UPnPSmartControlPoint.DeviceHandler(DeviceQuit);

            cp1.Rescan();

            
        }

        /**
        * \NewDevice                pour l'invocation d'une méthode distance d'un device détecté sur le réseau.
         * \param    sender1        sender1 pour le sender qui a declencher la methode.
        * \param    device          device est le device qui va apparaitre sur réseau.
         */

        public void NewDevice(UPnPSmartControlPoint sender1, UPnPDevice device)
        {


            if (device.FriendlyName != "ServeurClientUPnP")
            {
                Console.Out.WriteLine("ignoring " + device.FriendlyName);

                return;
            }

            nb_dev1++;

            Console.Out.WriteLine("ServeurClientUPnP found: " + nb_dev1);

            UPnPArgument[] args = new UPnPArgument[1];


            UPnPService serv = device.GetService("SampleClient");

            if (serv == null)
            {

                Console.Error.WriteLine("Could not find service `SampleClient' in device " + nb_dev1);

                return;
            }



            int x = _zonesMeth.Count;
            Console.WriteLine("x  =  " +x);

            string meths = ZonesMeth[x - 1].ToString();
            args[0] = new UPnPArgument("meth", meths);

            serv.InvokeSync("getresultat", args);
           
        }

        /**
        * \DeviceQuit       affiche un message si un device a quitté le réseau
        * \param    sender1         sender1 pour le sender qui a déclenché la méthode.
        * \param    device          device est le device qui va quitter le réseau.
        */

        public void DeviceQuit(UPnPSmartControlPoint sender1, UPnPDevice device)
        {

            Console.Out.WriteLine("ServeurClientUPnP quit: " + nb_dev1);
            nb_dev1--;

        }



        /**
        * \startUPnP       pour démarrer le device
        */
        public void startUPnP()
        {
            root2.StartDevice();
        }

        /**
        * \stopUPnP       pour arrêter le device

        */
        public void stopUPnP()
        {
            root2.StopDevice();
        }


        /**
        * \call      la méthode call est pour récupérer le résultat final
        * \param    component    le nom d'un composant de l'interface graphique générée.
        * \param    propriete    la propriété du composant.
        * \param    valeur       la valeur de la propriété du composant à mettre à jour.
        */
        public void call(string component, string propriete, string valeur)
        {

            Console.WriteLine("invocation de la méthode call est faite!!!!!!!!!!!!!!!!!!!!!");

            Console.WriteLine(component);
            Console.WriteLine(propriete);
            Console.WriteLine(valeur);

            Console.WriteLine("invocation de la methode call est terminée");
            mainwindow.changeresultat(component, propriete, valeur);
            
            
        }
    }
}
